package com.byron.media.server.rtsp.handlers;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import lombok.extern.slf4j.Slf4j;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.List;

@Slf4j
//@ChannelHandler.Sharable
public class RtpDecoder extends ByteToMessageDecoder {

    private final Charset charset;

    public RtpDecoder() {
        this(StandardCharsets.UTF_8);
    }

    public RtpDecoder(Charset charset) {
        if (charset == null) {
            throw new NullPointerException("charset");
        } else {
            this.charset = charset;
        }
    }


    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {

        int remain = in.readableBytes();
        if(remain < 6){
            return;
        }

        int originIndex = in.readerIndex();
        in.markReaderIndex(); // 标记读取的位置,方便后面reset

        byte firstByte = in.readByte();

        // RTP 数据
        if(firstByte == '$'){
            int readable = in.readableBytes();

            // RTSP 协议数据
            decodeRtp(originIndex, ctx, in, out);
        } else{
//                out.add(in);
            return;
        }
    }


    // TODO 解码RTP包
    private boolean decodeRtp(int originIndex, ChannelHandlerContext ctx, ByteBuf in, List<Object> out){
//        byte channel = in.readByte();
//        int length = in.readInt();
//        int readable = in.readableBytes();
//
//        if(length > readable){
//            in.resetReaderIndex();
//            return false;
//        }
//
//        if(length < 0){
//            in.resetReaderIndex();
//            return false;
//        }
//
//        byte dataType = in.readByte();
//        byte position = in.readByte();
//        int dataLength = in.readInt();
//        byte[] data = new byte[dataLength];
//        in.readBytes(data);
//        short extraLength = in.readShort();
//        String extra = null;
//        if(extraLength > 0){
//            byte[] extraBytes = new byte[extraLength];
//            in.readBytes(extraBytes);
//            extra = new String(extraBytes);
//        }
//
//        DataObj dataObj = new DataObj(dataType, position, data, extra);
//        out.add(dataObj);
//        in.markReaderIndex();
        return true;
    }

}
